{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "cell_id": "f6a27e2085c84834892fb19b1abf31c4",
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 664,
    "execution_start": 1660293330892,
    "source_hash": "ee2dcee6",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数据集大小： 500\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1eca7e0fba8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 导入数据集\n",
    "data = np.loadtxt('PCA_dataset.csv', delimiter=',')\n",
    "print('数据集大小：', len(data))\n",
    "\n",
    "# 可视化\n",
    "plt.figure()\n",
    "plt.scatter(data[:, 0], data[:, 1], color='blue', s=10)\n",
    "plt.axis('square')\n",
    "plt.ylim(-2, 8)\n",
    "plt.grid()\n",
    "plt.xlabel(r'$x_1$')\n",
    "plt.ylabel(r'$x_2$')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "cell_id": "6f97733b0a20476a91144869e008b297",
    "collapsed": true,
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 2,
    "execution_start": 1660293078045,
    "id": "E74EC9FF8CDC4271872000B35DA48AA0",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "source_hash": "d4408561",
    "tags": []
   },
   "outputs": [],
   "source": [
    "def pca(X, k):\n",
    "    d, m = X.shape\n",
    "    if d < k:\n",
    "        print('k应该小于特征数')\n",
    "        return X, None\n",
    "\n",
    "    # 中心化\n",
    "    X = X - np.mean(X, axis=0)\n",
    "    # 计算协方差矩阵\n",
    "    cov = X.T @ X\n",
    "    # 计算特征值和特征向量\n",
    "    eig_values, eig_vectors = np.linalg.eig(cov)\n",
    "    # 获取最大的k个特征值的下标\n",
    "    idx = np.argsort(-eig_values)[:k]\n",
    "    # 对应的特征向量\n",
    "    W = eig_vectors[:, idx]\n",
    "    # 降维\n",
    "    X = X @ W\n",
    "    return X, W"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "cell_id": "9330cd1cb3bb414cbc53904bab40eb4a",
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 855,
    "execution_start": 1660293382703,
    "source_hash": "1277cc9c",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "变换矩阵：\n",
      " [[ 0.90322448 -0.42916843]\n",
      " [ 0.42916843  0.90322448]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nlWFFw01NsdVxKyCLi1kXt5BX2mtbatHxraUcP4c1Ji5FifGp7ZN+ua7QhYZnc7HV2qLeXHkCVvQS\nLSLU/GPTvvw2zlgbqy2n6GXdbyiWidTFs0ypBq3V1tBbPFUsY/b7wRgryAsLrY72LHcJ9U3vhbKq\ncaHeUb6Xk+dF+t5oty+CUJJ7SGDcgEk3S1F30l6uR57gur/t29fKnf6iaAyAfpMqlpywrEJs6srk\nZPadP2FYKktLZqKwq6+OTzwVGhfw2muzlJ7R0SwnL9X+7dvbx49cWmpPOVlaMqkzu3dnk3P5k2j9\n9m+b3ER/DMi9e9sn7wqRN9latxSNmxj73R2Tc2kJ+OhHTUrXgw+adJ+8icAsExPtn198MTxu6cGD\n8RzLzZvbP4tkE52JxI/F5oEC3Z1Df9zKW2/NzoN7XVTb7xG3fHcMVDcFq5akKGrdlib04OmGVO8o\n5ln61bi86kzMW+n1eGOR0VB/YLc5INa+ZteNjfRdtP+1eJYp56KXYFhKO9ziYnuPoFiAyPUsR0ez\nqq8/SIadGynPDusB+/M49Xrs/rqpniUDPA0Vy6ouXsqN2E3KyCAbykPV0LvuauXakzfv99xcZ3uY\nP8hE3v57oazmGLcNzgpfaGCOvO3y0n1UszbLkKD6+bBFLxz/3rF5mSnttaFjCAXH8tosQ9v1Sq/l\nUCwT8R+SOkTnYpThWfYTt63u3ns7k7z9dUP9zbv1LMui7LmY7DS0odGWQuuHBrHIEx/72T3Hs7Pt\nbY+paWOxtLO8Ns6Qlxq73oOIC6zFyUkVy566O65n3G5nlc730QUzM8DXvpb1V7btjldfnX3utctm\nat9621Zn26Z27cq6+YW2nZkxc9hYm213Pb8Lo50/x3b5GwTdjifgY+2/7rr2/twnTnR2n3W75Frc\n/vTuebDr7djRPq+Q7Rt/223tbY+2rLx72c4btbTU3v/c7+pb9FykdBNe63nNo8xuylFSFLVuy3pr\ns0wl9Q1dlqfZzdva9zxCvY3Koh/XJ5QXWkakvug6pKaPFfXkCkW33XbivHbI1F5HRVXpPM+y381b\ng/AsKxe+Xpb1kjrULam2ltWG2U2ThF+t3rev1ZeXTb8eOntuy26GKUojKjoeNyiW15PLLSdlQjxL\naptl6rGGtk1JyyqDfrdZshq+DpmeBu65J0vJsCP09FJOapOEX63esaM/Q3H1u7q1lmaYUDWzaESp\n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\nrkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1eca8f957f0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X, W = pca(data, 2)\n",
    "print('变换矩阵：\\n', W)\n",
    "\n",
    "# 绘图\n",
    "plt.figure()\n",
    "plt.scatter(X[:, 0], X[:, 1], color='blue', s=10)\n",
    "plt.axis('square')\n",
    "plt.ylim(-5, 5)\n",
    "plt.grid()\n",
    "plt.xlabel(r'$x_1$')\n",
    "plt.ylabel(r'$x_2$')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "cell_id": "9ebd28c5c3824975bc68378a5793d108",
    "deepnote_cell_type": "code",
    "deepnote_to_be_reexecuted": false,
    "execution_millis": 253,
    "execution_start": 1660293646968,
    "id": "5094FD114B51443EACDAB2D0C183285D",
    "jupyter": {},
    "scrolled": false,
    "slideshow": {
     "slide_type": "slide"
    },
    "source_hash": "f1a5a4a7",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sklearn计算的变换矩阵：\n",
      " [[-0.90322448  0.42916843]\n",
      " [-0.42916843 -0.90322448]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nFEtCCDHw/wHKxnPxSAVZRQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1eca900a320>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.decomposition import PCA\n",
    "\n",
    "# 中心化\n",
    "X = data - np.mean(data, axis=0)\n",
    "pca_res = PCA(n_components=2).fit(X)\n",
    "W = pca_res.components_.T\n",
    "print ('sklearn计算的变换矩阵：\\n', W)\n",
    "X_pca = X @ W\n",
    "\n",
    "# 绘图\n",
    "plt.figure()\n",
    "plt.scatter(X_pca[:, 0], X_pca[:, 1], color='blue', s=10)\n",
    "plt.axis('square')\n",
    "plt.ylim(-5, 5)\n",
    "plt.grid()\n",
    "plt.xlabel(r'$x_1$')\n",
    "plt.ylabel(r'$x_2$')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "deepnote": {},
  "deepnote_execution_queue": [],
  "deepnote_notebook_id": "1c69d9d8957b4e07a2c94ce4117cb5c4",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
